Pla Clima

El canvi climàtic és una realitat i està ocasionat per l’ésser humà. Ja tenim evidències dels seus impactes i cal actuar per a fer-hi front.

Les ciutats són especialment vulnerables, ja que concentren la majoria de la població mundial i és on l’energia es consumeix de manera més intensiva, generant el 70% de les emissions de gasos amb efecte d’hivernacle.

Barcelona és una ciutat mediterrània, que consumeix poca energia i genera poques emissions per càpita en relació a altres ciutats similars, però encara té molt camí per recórrer, ja que té una elevada dependència de recursos fòssils i nuclears.

Els efectes del canvi climàtic podrien presentar riscos en termes de salut i benestar de les persones (onades de calor), de seguretat (garantia de subministrament d’aigua i d’energia, vulnerabilitat de les infraestructures, risc d’incendis..) i en l’entorn natural que cal preveure i prevenir a nivell global.

Amb motiu de la celebració a París de la COP21, la 21a Conferència de les Parts de la Convenció Marc de les Nacions Unides sobre el Canvi Climàtic, i en el marc del Compromís Ciutadà per la Sostenibilitat, Barcelona va concretar un Compromís de Barcelona pel Clima, en què es comprometia a reduir les emissions de gasos em efecte hivernacle un 40% al 2030 en relació al 2005 i augmentar 1,6km2 de verd urbà com a mesura d’adaptació.

Ajuntament i ciutadania van establir un Full de Ruta 2015-2017 amb projectes municipals i ciutadans per aconseguir aquests objectius. A partir de l’experiència d’aquests dos anys l’Ajuntament vol donar una resposta més potent i estructurada a aquest compromís i per això es proposa aglutinar les accions que du a terme al voltant del repte del canvi climàtic en un únic pla que integri totes les línies de treball: el Pla Clima.

És un pla que alhora concreta els compromisos internacionals signats per l’Ajuntament, com és el Pacte d’Alcaldes i Alcaldesses pel Clima i l’Energia Sostenible.

Qualitat de l’aire de la ciutat de Barcelona

Es mostren dades dels contaminants mesurats a les estacions de la ciutat de Barcelona. L’actualització es realitza en intervals d’una hora indicant si el valor està o no validat i també es mostren les dades dels tres dies anteriors a l’actual. Tanmateix es publiquen històrics amb periodicitat mensual.

library(data.table) 
library(dplyr)
library(lubridate)

Attaching package: ‘lubridate’

The following objects are masked from ‘package:data.table’:

    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

The following object is masked from ‘package:base’:

    date
gener <- tbl_df(fread("data/2019_01_Gener_qualitat_aire_BCN.csv",
               header=TRUE))
gener %>% select(nom_cabina, longitud, latitud) %>% distinct()
gener2 <- gener %>%
  mutate(sector = as.factor(str_extract(nom_cabina, "(?<=[-]\\D).*")),
         qualitat_aire = as.factor(qualitat_aire),
         qualitat_o3 = as.factor(qualitat_o3),
         valor_o3 = as.numeric(str_extract(valor_o3, "^[[:digit:]]")),
         qualitat_no2 = as.factor(qualitat_no2),
         valor_no2 = as.numeric(str_extract(valor_no2, "^[[:digit:]]")),
         qualitat_pm10 = as.factor(qualitat_pm10),
         valor_pm10 = as.numeric(str_extract(valor_pm10, "^[[:digit:]]")),
         generat = dmy_hm(generat)
         ) %>%
  select(sector, qualitat_aire, qualitat_o3, valor_o3, qualitat_no2, valor_no2, qualitat_pm10,
         valor_pm10, generat)
summary(gener2)
          sector     qualitat_aire  qualitat_o3     valor_o3      qualitat_no2 
 Ciutadella  : 738   --     : 162   --   : 287   Min.   :1.000   --     : 341  
 Eixample    : 738   Bona   :5571   Bona :4035   1st Qu.:2.000   Bona   :5358  
 Gràcia      : 738   Pobra  :   6   Pobra:   1   Median :4.000   Regular:  75  
 Observ Fabra: 738   Regular: 165   NA's :1581   Mean   :3.714   NA's   : 130  
 Palau Reial : 738                               3rd Qu.:5.000                 
 Poblenou    : 738                               Max.   :9.000                 
 (Other)     :1476                               NA's   :1868                  
   valor_no2     qualitat_pm10    valor_pm10       generat                   
 Min.   :1.000   --     :  42   Min.   :1.000   Min.   :2019-01-01 00:00:00  
 1st Qu.:2.000   Bona   :4238   1st Qu.:1.000   1st Qu.:2019-01-08 17:00:00  
 Median :3.000   Pobra  :   5   Median :1.000   Median :2019-01-16 14:30:00  
 Mean   :3.654   Regular: 102   Mean   :2.447   Mean   :2019-01-16 12:34:13  
 3rd Qu.:5.000   NA's   :1517   3rd Qu.:2.000   3rd Qu.:2019-01-24 07:00:00  
 Max.   :9.000                  Max.   :9.000   Max.   :2019-01-31 23:00:00  
 NA's   :471                    NA's   :1559                                 
gener2 %>% 
  filter(sector == "Palau Reial") %>% 
  select(valor_no2, generat) %>%
  ggplot(aes(x = generat, y = valor_no2)) +
  geom_line()

gener2 %>% 
  filter(sector == "Palau Reial", generat >= as.Date("2019-01-15"), generat <= as.Date("2019-01-16")) %>% 
  select(valor_no2, generat) %>%
  ggplot(aes(x = generat, y = valor_no2)) +
  geom_line() + geom_point()

NA
gener3 <- gener %>% 
  mutate(sector = as.factor(str_extract(nom_cabina, "(?<=[-]\\D).*")),
         qualitat_aire = as.factor(qualitat_aire),
         qualitat_o3 = as.factor(qualitat_o3),
         valor_o3 = as.numeric(str_extract(valor_o3, "^[[:digit:]]")),
         qualitat_no2 = as.factor(qualitat_no2),
         valor_no2 = as.numeric(str_extract(valor_no2, "^[[:digit:]]")),
         qualitat_pm10 = as.factor(qualitat_pm10),
         valor_pm10 = as.numeric(str_extract(valor_pm10, "^[[:digit:]]")),
         date = str_extract(generat, ".*[[:space:]]"),
         hour = str_extract(generat, "(?<=[[:space:]])[0-9.]+")) %>%
  separate(col = date, into = c("day", "month", "year"), sep = "/") %>%
  mutate(day = as.integer(day),
         month = as.integer(month),
         year = as.integer(year),
         hour = as.integer(hour)) %>%
  select(sector, qualitat_aire, qualitat_o3, valor_o3, qualitat_no2, valor_no2, qualitat_pm10,
         valor_pm10, day, month, year, hour)
summary(gener3)
          sector     qualitat_aire  qualitat_o3     valor_o3      qualitat_no2 
 Ciutadella  : 738   --     : 162   --   : 287   Min.   :1.000   --     : 341  
 Eixample    : 738   Bona   :5571   Bona :4035   1st Qu.:2.000   Bona   :5358  
 Gràcia      : 738   Pobra  :   6   Pobra:   1   Median :4.000   Regular:  75  
 Observ Fabra: 738   Regular: 165   NA's :1581   Mean   :3.714   NA's   : 130  
 Palau Reial : 738                               3rd Qu.:5.000                 
 Poblenou    : 738                               Max.   :9.000                 
 (Other)     :1476                               NA's   :1868                  
   valor_no2     qualitat_pm10    valor_pm10         day            month  
 Min.   :1.000   --     :  42   Min.   :1.000   Min.   : 1.00   Min.   :1  
 1st Qu.:2.000   Bona   :4238   1st Qu.:1.000   1st Qu.: 8.00   1st Qu.:1  
 Median :3.000   Pobra  :   5   Median :1.000   Median :16.00   Median :1  
 Mean   :3.654   Regular: 102   Mean   :2.447   Mean   :16.05   Mean   :1  
 3rd Qu.:5.000   NA's   :1517   3rd Qu.:2.000   3rd Qu.:24.00   3rd Qu.:1  
 Max.   :9.000                  Max.   :9.000   Max.   :31.00   Max.   :1  
 NA's   :471                    NA's   :1559                               
      year           hour      
 Min.   :2019   Min.   : 0.00  
 1st Qu.:2019   1st Qu.: 5.00  
 Median :2019   Median :11.00  
 Mean   :2019   Mean   :11.43  
 3rd Qu.:2019   3rd Qu.:17.00  
 Max.   :2019   Max.   :23.00  
                               

BV: µg/m³ medio de contaminadores por horas en enero en 8 barrios de Barcelona.

gener3 %>% 
  gather(measure, measure_value, valor_o3, valor_no2, valor_pm10) %>%
  filter(year == 2019, month == 1) %>%
  select(day, hour, measure, measure_value, sector) %>%
  group_by(hour, measure, sector) %>%
  summarise(mean_val_hour = mean(measure_value, na.rm = TRUE)) %>%
  ggplot(aes(hour, mean_val_hour, color = measure)) +
  labs(title = "µg/m³ medio de contaminadores",
       x = "Hora", 
       y = "µg/m³ medio",
       color = "Contaminador",
       caption = "Datos de opendata-ajuntament.barcelona.cat") +
  scale_color_discrete(labels = c("NO2", "O3", "PM10")) +
  geom_line() +
  geom_point() + 
  facet_wrap(~ sector, nrow = 2) +
  theme_minimal()

The study suggested that for 2015, the total existing UK vegetation reduces the average annual surface concentration by about 10% for PM2.5, 6% for PM10, 13% for O3, 24% for NH3 and 30% for SO2, but did not markedly change NO2 concentrations. https://airqualitynews.com/2018/07/30/plants-and-trees-not-the-solution-to-air-pollution-in-cities/

Cleaning dataset function:

clean_bcn_data <- function(data) {
  data <- data %>% 
  mutate(sector = as.factor(str_extract(nom_cabina, "(?<=[-]\\D).*")),
         qualitat_aire = as.factor(qualitat_aire),
         qualitat_o3 = as.factor(qualitat_o3),
         valor_o3 = as.numeric(str_extract(valor_o3, "^[[:digit:]]")),
         qualitat_no2 = as.factor(qualitat_no2),
         valor_no2 = as.numeric(str_extract(valor_no2, "^[[:digit:]]")),
         qualitat_pm10 = as.factor(qualitat_pm10),
         valor_pm10 = as.numeric(str_extract(valor_pm10, "^[[:digit:]]")),
         date = str_extract(generat, ".*[[:space:]]"),
         hour = str_extract(generat, "(?<=[[:space:]])[0-9.]+")) %>%
  separate(col = date, into = c("day", "month", "year"), sep = "/") %>%
  mutate(day = as.integer(day),
         month = as.integer(month),
         year = as.integer(year),
         hour = as.integer(hour),
         month = case_when(month == 1 ~ as.integer(13), TRUE ~ as.integer(month))) %>%
  select(sector, qualitat_aire, qualitat_o3, valor_o3, qualitat_no2, valor_no2, qualitat_pm10,
         valor_pm10, day, month, year, hour)
  data
}

Aggregate data:

data_06_2018 <- tbl_df(fread("data/2018_06_Juny_qualitat_aire_BCN.csv", header=TRUE))
data_07_2018 <- tbl_df(fread("data/2018_07_Juliol_qualitat_aire_BCN.csv", header=TRUE))
data_08_2018 <- tbl_df(fread("data/2018_08_Agost_qualitat_aire_BCN.csv", header=TRUE))
data_09_2018 <- tbl_df(fread("data/2018_09_Setembre_qualitat_aire_BCN.csv", header=TRUE))
data_10_2018 <- tbl_df(fread("data/2018_10_Octubre_qualitat_aire_BCN.csv", header=TRUE))
data_12_2018 <- tbl_df(fread("data/2018_12_Desembre_qualitat_aire_BCN.csv", header=TRUE))
data_11_2018 <- tbl_df(fread("data/2018_11_novembre_qualitat_aire_BCN.csv", header=TRUE))
data_01_2019 <- tbl_df(fread("data/2019_01_Gener_qualitat_aire_BCN.csv", header=TRUE))
data <- rbind(data_06_2018,
              data_07_2018,
              data_08_2018,
              data_09_2018,
              data_10_2018,
              data_11_2018,
              data_12_2018,
              data_01_2019) %>% clean_bcn_data() 
summary(data)
         sector     qualitat_aire    qualitat_o3       valor_o3      qualitat_no2  
 Ciutadella :5320   --     : 2573   --     : 1893   Min.   :1.000   --     : 2302  
 Eixample   :5320   Bona   :36760   Bona   :27028   1st Qu.:2.000   Bona   :36990  
 Gràcia     :5320   Pobra  :  160   Pobra  :   18   Median :4.000   Regular:  595  
 Palau Reial:5320   Regular: 2394   Regular:  541   Mean   :4.196   NA's   : 2000  
 Poblenou   :5320                   NA's   :12407   3rd Qu.:6.000                  
 Sants      :5320                                   Max.   :9.000                  
 (Other)    :9967                                   NA's   :14309                  
   valor_no2     qualitat_pm10     valor_pm10         day            month       
 Min.   :1.000   --     :  542   Min.   :1.000   Min.   : 1.00   Min.   : 1.000  
 1st Qu.:2.000   Bona   :23621   1st Qu.:1.000   1st Qu.: 9.00   1st Qu.: 7.000  
 Median :3.000   Pobra  :  142   Median :2.000   Median :16.00   Median : 9.000  
 Mean   :3.548   Regular: 1393   Mean   :2.316   Mean   :16.34   Mean   : 8.155  
 3rd Qu.:5.000   NA's   :16189   3rd Qu.:3.000   3rd Qu.:24.00   3rd Qu.:11.000  
 Max.   :9.000                   Max.   :9.000   Max.   :31.00   Max.   :12.000  
 NA's   :4311                    NA's   :16740                                   
      year           hour     
 Min.   :2018   Min.   : 0.0  
 1st Qu.:2018   1st Qu.: 6.0  
 Median :2018   Median :12.0  
 Mean   :2018   Mean   :11.6  
 3rd Qu.:2018   3rd Qu.:18.0  
 Max.   :2019   Max.   :23.0  
                              
plotit <- data %>% 
  gather(measure, measure_value, valor_o3, valor_no2, valor_pm10) %>%
  filter(year >= 2018, month >= 6, sector %in% c("Eixample", "Palau Reial", "Vall Hebron")) %>%
  select(month, day, hour, measure, measure_value, sector) %>%
  group_by(month, hour, measure, sector) %>%
  summarise(mean_val_hour = mean(measure_value, na.rm = TRUE)) %>%
  ggplot(aes(hour, mean_val_hour, color = measure)) +
  labs(title = "µg/m³ medio de contaminadores",
       x = "Hora", 
       y = "µg/m³ medio",
       color = "Contaminador",
       caption = "Datos de opendata-ajuntament.barcelona.cat") +
  scale_color_discrete(labels = c("NO2", "O3", "PM10")) +
  geom_line() +
  geom_point() + 
  facet_grid(sector ~ month) +
  theme_minimal()
data %>% 
  gather(measure, measure_value, valor_o3, valor_no2, valor_pm10) %>%
  filter(year >= 2018, month >= 6, sector %in% c("Eixample", "Palau Reial", "Vall Hebron")) %>%
  select(month, day, hour, measure, measure_value, sector) %>%
  group_by(month, measure, sector) %>%
  summarise(mean_val_month = mean(measure_value, na.rm = TRUE)) %>%
  ggplot(aes(month, mean_val_month, color = measure)) +
  labs(title = "µg/m³ medio de contaminadores",
       x = "Mes", 
       y = "µg/m³ medio",
       color = "Contaminador",
       caption = "Datos de opendata-ajuntament.barcelona.cat") +
  scale_color_discrete(labels = c("NO2", "O3", "PM10")) +
  geom_line() +
  geom_point() + 
  facet_wrap(~ sector, nrow = 4) +
  theme_minimal()

plotit <- data %>% 
  gather(measure, measure_value, valor_o3, valor_no2, valor_pm10) %>%
  filter(year >= 2018, month >= 6, sector %in% c("Eixample", "Palau Reial", "Vall Hebron")) %>%
  select(month, day, hour, measure, measure_value, sector) %>%
  group_by(month, sector) %>%
  summarise(mean_val_month = mean(measure_value, na.rm = TRUE)) %>%
  ggplot(aes(month, mean_val_month)) +
  labs(title = "µg/m³ medio de contaminadores",
       x = "Mes", 
       y = "µg/m³ medio",
       caption = "Datos de opendata-ajuntament.barcelona.cat") +
  geom_line() +
  geom_point() + 
  facet_wrap(~ sector, nrow = 4) +
  theme_minimal()
library(plotly)
library(htmlwidgets)
saveWidget(ggplotly(plotit, dynamicTicks = FALSE), file = "meancont.html");

Just clean

clean_data <- function(data) {
  data <- data %>% 
  mutate(sector = as.factor(str_extract(nom_cabina, "(?<=[-]\\D).*")),
         qualitat_aire = as.factor(qualitat_aire),
         qualitat_o3 = as.factor(qualitat_o3),
         valor_o3 = as.numeric(str_extract(valor_o3, "^[[:digit:]]")),
         qualitat_no2 = as.factor(qualitat_no2),
         valor_no2 = as.numeric(str_extract(valor_no2, "^[[:digit:]]")),
         qualitat_pm10 = as.factor(qualitat_pm10),
         valor_pm10 = as.numeric(str_extract(valor_pm10, "^[[:digit:]]")),
         date = str_extract(generat, ".*[[:space:]]"),
         hour = str_extract(generat, "(?<=[[:space:]])[0-9.]+")) %>%
  separate(col = date, into = c("day", "month", "year"), sep = "/") %>%
  mutate(day = as.integer(day),
         month = as.integer(month),
         year = as.integer(year),
         hour = as.integer(hour),
         month = as.integer(month)) %>%
  select(sector, qualitat_aire, qualitat_o3, valor_o3, qualitat_no2, valor_no2, qualitat_pm10,
         valor_pm10, day, month, year, hour)
  data
}
(p <- data_06_2018 %>% clean_data() %>%
  gather(measure, measure_value, valor_o3, valor_no2, valor_pm10) %>%
  filter(year == 2018, month == 6) %>%
  select(day, hour, measure, measure_value, sector) %>%
   mutate(measure = case_when(measure == "valor_no2" ~ "NO2",
                              measure == "valor_o3" ~ "O3",
                              measure == "valor_pm10" ~ "PM10",
                              TRUE ~ measure)) %>%
  group_by(hour, measure, sector) %>%
  summarise(mean_val_hour = mean(measure_value, na.rm = TRUE)) %>%
   
   
   
  ggplot(aes(hour, mean_val_hour, color = measure)) +
  labs(title = "Mean value of pollutants by hour in June 2018",
       x = "Hour", 
       y = "µg/m³",
       color = "Pollutant",
       caption = "Data from opendata-ajuntament.barcelona.cat") +
  #scale_color_discrete(labels = c("NO2", "O3", "PM10")) +
  geom_line() +
  geom_point() + 
  facet_wrap(~ sector, nrow = 2) +
  theme_mine()
  )

saveWidget(ggplotly(p, dynamicTicks = TRUE), file = "meanjun.html")
ggplotly(p) 

Mortalitat

mortalitat <- tbl_df(fread("2018_taxa_mortalitat.csv", header=TRUE))
mortalitat %>%
  select(Nom_districte, Nom_barri, Nombre) %>%
  group_by(Nom_districte) %>%
  summarise(mean_n = mean(Nombre)) %>%
  ggplot() +
  geom_bar(aes(x = Nom_districte, y = mean_n),stat = "identity")
theme_mine <- function () { 
    theme_bw(base_size=12, base_family="Montserrat") %+replace% 
        theme(
            panel.background  = element_blank(),
            plot.background = element_rect(fill="#ebfff5", colour=NA), 
            legend.background = element_rect(fill="transparent", colour=NA),
            legend.key = element_rect(fill="transparent", colour=NA)
        )
}
data_06_2019 <- tbl_df(fread("data/2019_06_juny_qualitat_aire_BCN.csv", header=TRUE))
summary(data_06_2019)
 CODI_PROVINCIA  PROVINCIA         CODI_MUNICIPI   MUNICIPI            ESTACIO     
 Min.   :8      Length:1164        Min.   :19    Length:1164        Min.   : 4.00  
 1st Qu.:8      Class :character   1st Qu.:19    Class :character   1st Qu.:43.00  
 Median :8      Mode  :character   Median :19    Mode  :character   Median :44.00  
 Mean   :8                         Mean   :19                       Mean   :44.52  
 3rd Qu.:8                         3rd Qu.:19                       3rd Qu.:54.00  
 Max.   :8                         Max.   :19                       Max.   :57.00  
                                                                                   
 CODI_CONTAMINANT      ANY            MES         DIA             H01        
 Min.   : 1.000   Min.   :2019   Min.   :6   Min.   : 1.00   Min.   :  0.20  
 1st Qu.: 7.000   1st Qu.:2019   1st Qu.:6   1st Qu.: 8.00   1st Qu.:  1.00  
 Median : 8.000   Median :2019   Median :6   Median :16.00   Median : 19.00  
 Mean   : 8.634   Mean   :2019   Mean   :6   Mean   :15.51   Mean   : 25.76  
 3rd Qu.:12.000   3rd Qu.:2019   3rd Qu.:6   3rd Qu.:23.00   3rd Qu.: 39.00  
 Max.   :14.000   Max.   :2019   Max.   :6   Max.   :30.00   Max.   :564.00  
                                                             NA's   :17      
     V01                 H02             V02                 H03        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  1.00   Class :character   1st Qu.:  1.00  
 Mode  :character   Median : 16.00   Mode  :character   Median : 15.00  
                    Mean   : 25.68                      Mean   : 24.83  
                    3rd Qu.: 39.00                      3rd Qu.: 39.00  
                    Max.   :509.00                      Max.   :325.00  
                    NA's   :17                          NA's   :17      
     V03                 H04             V04                 H05        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  1.00   Class :character   1st Qu.:  1.00  
 Mode  :character   Median : 15.00   Mode  :character   Median : 14.00  
                    Mean   : 23.87                      Mean   : 23.07  
                    3rd Qu.: 38.00                      3rd Qu.: 36.00  
                    Max.   :334.00                      Max.   :397.00  
                    NA's   :18                          NA's   :18      
     V05                 H06             V06                 H07        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  1.00   Class :character   1st Qu.:  2.00  
 Mode  :character   Median : 14.00   Mode  :character   Median : 18.00  
                    Mean   : 23.07                      Mean   : 27.44  
                    3rd Qu.: 35.00                      3rd Qu.: 41.00  
                    Max.   :301.00                      Max.   :425.00  
                    NA's   :18                          NA's   :18      
     V07                 H08             V08                 H09       
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.2  
 Class :character   1st Qu.:  3.00   Class :character   1st Qu.:  4.0  
 Mode  :character   Median : 24.00   Mode  :character   Median : 27.0  
                    Mean   : 35.24                      Mean   : 39.9  
                    3rd Qu.: 50.00                      3rd Qu.: 52.0  
                    Max.   :482.00                      Max.   :674.0  
                    NA's   :18                          NA's   :19     
     V09                 H10             V10                 H11        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  4.00   Class :character   1st Qu.:  4.00  
 Mode  :character   Median : 25.00   Mode  :character   Median : 23.00  
                    Mean   : 37.82                      Mean   : 34.67  
                    3rd Qu.: 51.25                      3rd Qu.: 50.00  
                    Max.   :759.00                      Max.   :492.00  
                    NA's   :28                          NA's   :40      
     V11                 H12             V12                 H13        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  3.00   Class :character   1st Qu.:  3.00  
 Mode  :character   Median : 21.00   Mode  :character   Median : 20.00  
                    Mean   : 31.71                      Mean   : 30.59  
                    3rd Qu.: 50.00                      3rd Qu.: 48.00  
                    Max.   :264.00                      Max.   :240.00  
                    NA's   :45                          NA's   :44      
     V13                 H14             V14                 H15        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  3.00   Class :character   1st Qu.:  2.00  
 Mode  :character   Median : 18.00   Mode  :character   Median : 15.00  
                    Mean   : 29.26                      Mean   : 26.85  
                    3rd Qu.: 45.00                      3rd Qu.: 39.00  
                    Max.   :160.00                      Max.   :166.00  
                    NA's   :80                          NA's   :70      
     V15                 H16             V16                 H17        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  2.00   Class :character   1st Qu.:  2.00  
 Mode  :character   Median : 14.00   Mode  :character   Median : 14.00  
                    Mean   : 26.52                      Mean   : 27.47  
                    3rd Qu.: 39.00                      3rd Qu.: 41.00  
                    Max.   :190.00                      Max.   :240.00  
                    NA's   :51                          NA's   :40      
     V17                 H18             V18                 H19        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  2.00   Class :character   1st Qu.:  2.00  
 Mode  :character   Median : 15.00   Mode  :character   Median : 16.00  
                    Mean   : 27.94                      Mean   : 28.18  
                    3rd Qu.: 42.00                      3rd Qu.: 44.00  
                    Max.   :318.00                      Max.   :239.00  
                    NA's   :40                          NA's   :45      
     V19                 H20             V20                 H21        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  2.00   Class :character   1st Qu.:  1.00  
 Mode  :character   Median : 17.00   Mode  :character   Median : 18.00  
                    Mean   : 28.52                      Mean   : 27.37  
                    3rd Qu.: 43.50                      3rd Qu.: 43.00  
                    Max.   :322.00                      Max.   :289.00  
                    NA's   :45                          NA's   :46      
     V21                 H22             V22                 H23        
 Length:1164        Min.   :  0.20   Length:1164        Min.   :  0.20  
 Class :character   1st Qu.:  1.00   Class :character   1st Qu.:  1.00  
 Mode  :character   Median : 19.00   Mode  :character   Median : 18.00  
                    Mean   : 26.62                      Mean   : 25.65  
                    3rd Qu.: 42.00                      3rd Qu.: 42.25  
                    Max.   :182.00                      Max.   :181.00  
                    NA's   :46                          NA's   :48      
     V23                 H24             V24           
 Length:1164        Min.   :  0.20   Length:1164       
 Class :character   1st Qu.:  1.00   Class :character  
 Mode  :character   Median : 18.00   Mode  :character  
                    Mean   : 25.92                     
                    3rd Qu.: 41.00                     
                    Max.   :338.00                     
                    NA's   :48                         
length(names(data_06_2019))
[1] 57
(i <- data_06_2019 %>%
  select(5:57) %>%
  mutate(measure = as.factor(case_when(CODI_CONTAMINANT == 1 ~ "SO2",
                              CODI_CONTAMINANT == 7 ~ "NO",
                              CODI_CONTAMINANT == 8 ~ "NO2",
                              CODI_CONTAMINANT == 12 ~ "NOx",
                              CODI_CONTAMINANT == 14 ~ "O3",
                              CODI_CONTAMINANT == 6 ~ "CO",
                              CODI_CONTAMINANT == 10 ~ "PM10",
                              TRUE ~ ""))) %>%
  mutate(sector = as.factor(case_when(ESTACIO == 4 ~ "Poblenou",
                              ESTACIO == 42 ~ "Sants",
                              ESTACIO == 43 ~ "Eixample",
                              ESTACIO == 44 ~ "Gràcia",
                              ESTACIO == 50 ~ "Ciutadella",
                              ESTACIO == 54 ~ "Vall Hebron",
                              ESTACIO == 57 ~ "Palau Reial",
                              TRUE ~ ""))) %>%
  gather(hour, measure_value, starts_with("H")) %>%
  gather(validation, val, starts_with("V")) %>% distinct() %>%
  mutate(day = as.integer(DIA),
         month = as.integer(MES),
         year = as.integer(ANY),
         hour = as.integer(str_extract(hour,"..$"))) %>%
  select(sector, year, month, day, hour, measure, measure_value) %>%
  #filter(sector == "Ciutadella") %>%
  group_by(hour, measure, sector) %>%
  summarise(mean_val_hour = mean(measure_value, na.rm = TRUE)) %>%
    
  ggplot(aes(hour, mean_val_hour, color = measure)) +
  labs(title = "Mean value of pollutants by hour in June 2019",
       x = "Hour", 
       y = "µg/m³",
       color = "Pollutant",
       caption = "Data from opendata-ajuntament.barcelona.cat") +
  #scale_color_discrete(labels = c("NO2", "O3", "PM10")) +
  scale_color_manual(values = c("purple", "yellow", "red", "orange", "green", "blue", "pink")) +
  geom_line(size=1) +
  geom_hline(yintercept = 90, linetype = 2, color = "red") +
  geom_hline(yintercept = 110, linetype = 2, color = "green") +
  #geom_hline(yintercept = 200, linetype = 2, color = "pink") +
  #geom_text(aes(0,90,label = "Limit NO2 by h", vjust = -1), color = "black") +
  #geom_point() + 
  scale_x_continuous(limits = c(0, 22)) + 
  facet_wrap(~ sector, nrow = 1) +
  theme_mine())

NA
ggplotly(i) 
LS0tCnRpdGxlOiAiT3BlbiBEYXRhIEJhcmNlbG9uYSIKYXV0aG9yOiAiUml0YSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgUGxhIENsaW1hCgpFbCBjYW52aSBjbGltw6B0aWMgw6lzIHVuYSByZWFsaXRhdCBpIGVzdMOgIG9jYXNpb25hdCBwZXIgbOKAmcOpc3NlciBodW3DoC4gSmEgdGVuaW0gZXZpZMOobmNpZXMgZGVscyBzZXVzIGltcGFjdGVzIGkgY2FsIGFjdHVhciBwZXIgYSBmZXItaGkgZnJvbnQuICAKCkxlcyBjaXV0YXRzIHPDs24gZXNwZWNpYWxtZW50IHZ1bG5lcmFibGVzLCBqYSBxdWUgY29uY2VudHJlbiBsYSBtYWpvcmlhIGRlIGxhIHBvYmxhY2nDsyBtdW5kaWFsIGkgw6lzIG9uIGzigJllbmVyZ2lhIGVzIGNvbnN1bWVpeCBkZSBtYW5lcmEgbcOpcyBpbnRlbnNpdmEsIGdlbmVyYW50IGVsIDcwJSBkZSBsZXMgZW1pc3Npb25zIGRlIGdhc29zIGFtYiBlZmVjdGUgZOKAmWhpdmVybmFjbGUuCgpCYXJjZWxvbmEgw6lzIHVuYSBjaXV0YXQgbWVkaXRlcnLDoG5pYSwgcXVlIGNvbnN1bWVpeCBwb2NhIGVuZXJnaWEgaSBnZW5lcmEgcG9xdWVzIGVtaXNzaW9ucyBwZXIgY8OgcGl0YSBlbiByZWxhY2nDsyBhIGFsdHJlcyBjaXV0YXRzIHNpbWlsYXJzLCBwZXLDsiBlbmNhcmEgdMOpIG1vbHQgY2Ftw60gcGVyIHJlY8OzcnJlciwgamEgcXVlIHTDqSB1bmEgZWxldmFkYSBkZXBlbmTDqG5jaWEgZGUgcmVjdXJzb3MgZsOyc3NpbHMgaSBudWNsZWFycy4KCkVscyBlZmVjdGVzIGRlbCBjYW52aSBjbGltw6B0aWMgcG9kcmllbiBwcmVzZW50YXIgcmlzY29zIGVuIHRlcm1lcyBkZSBzYWx1dCBpIGJlbmVzdGFyIGRlIGxlcyBwZXJzb25lcyAob25hZGVzIGRlIGNhbG9yKSwgZGUgc2VndXJldGF0IChnYXJhbnRpYSBkZSBzdWJtaW5pc3RyYW1lbnQgZOKAmWFpZ3VhIGkgZOKAmWVuZXJnaWEsIHZ1bG5lcmFiaWxpdGF0IGRlIGxlcyBpbmZyYWVzdHJ1Y3R1cmVzLCByaXNjIGTigJlpbmNlbmRpcy4uKSBpIGVuIGzigJllbnRvcm4gbmF0dXJhbCBxdWUgY2FsIHByZXZldXJlIGkgcHJldmVuaXIgYSBuaXZlbGwgZ2xvYmFsLgoKQW1iIG1vdGl1IGRlIGxhIGNlbGVicmFjacOzIGEgUGFyw61zIGRlIGxhIENPUDIxLCBsYSAyMWEgQ29uZmVyw6huY2lhIGRlIGxlcyBQYXJ0cyBkZSBsYSBDb252ZW5jacOzIE1hcmMgZGUgbGVzIE5hY2lvbnMgVW5pZGVzIHNvYnJlIGVsIENhbnZpIENsaW3DoHRpYywgaSBlbiBlbCBtYXJjIGRlbCBDb21wcm9tw61zIENpdXRhZMOgIHBlciBsYSBTb3N0ZW5pYmlsaXRhdCwgQmFyY2Vsb25hIHZhIGNvbmNyZXRhciB1biBDb21wcm9tw61zIGRlIEJhcmNlbG9uYSBwZWwgQ2xpbWEsIGVuIHF1w6ggZXMgY29tcHJvbWV0aWEgYSByZWR1aXIgbGVzIGVtaXNzaW9ucyBkZSBnYXNvcyBlbSBlZmVjdGUgaGl2ZXJuYWNsZSB1biA0MCUgYWwgMjAzMCBlbiByZWxhY2nDsyBhbCAyMDA1IGkgYXVnbWVudGFyIDEsNmttMiBkZSB2ZXJkIHVyYsOgIGNvbSBhIG1lc3VyYSBk4oCZYWRhcHRhY2nDsy4KCkFqdW50YW1lbnQgaSBjaXV0YWRhbmlhIHZhbiBlc3RhYmxpciB1biBGdWxsIGRlIFJ1dGEgMjAxNS0yMDE3IGFtYiBwcm9qZWN0ZXMgbXVuaWNpcGFscyBpIGNpdXRhZGFucyBwZXIgYWNvbnNlZ3VpciBhcXVlc3RzIG9iamVjdGl1cy4gQSBwYXJ0aXIgZGUgbOKAmWV4cGVyacOobmNpYSBk4oCZYXF1ZXN0cyBkb3MgYW55cyBs4oCZQWp1bnRhbWVudCB2b2wgZG9uYXIgdW5hIHJlc3Bvc3RhIG3DqXMgcG90ZW50IGkgZXN0cnVjdHVyYWRhIGEgYXF1ZXN0IGNvbXByb23DrXMgaSBwZXIgYWl4w7IgZXMgcHJvcG9zYSBhZ2x1dGluYXIgbGVzIGFjY2lvbnMgcXVlIGR1IGEgdGVybWUgYWwgdm9sdGFudCBkZWwgcmVwdGUgZGVsIGNhbnZpIGNsaW3DoHRpYyBlbiB1biDDum5pYyBwbGEgcXVlIGludGVncmkgdG90ZXMgbGVzIGzDrW5pZXMgZGUgdHJlYmFsbDogZWwgUGxhIENsaW1hLgoKw4lzIHVuIHBsYSBxdWUgYWxob3JhIGNvbmNyZXRhIGVscyBjb21wcm9taXNvcyBpbnRlcm5hY2lvbmFscyBzaWduYXRzIHBlciBs4oCZQWp1bnRhbWVudCwgY29tIMOpcyBlbCBQYWN0ZSBk4oCZQWxjYWxkZXMgaSBBbGNhbGRlc3NlcyBwZWwgQ2xpbWEgaSBs4oCZRW5lcmdpYSBTb3N0ZW5pYmxlLgoKIyMgUXVhbGl0YXQgZGUgbCdhaXJlIGRlIGxhIGNpdXRhdCBkZSBCYXJjZWxvbmEKRXMgbW9zdHJlbiBkYWRlcyBkZWxzIGNvbnRhbWluYW50cyBtZXN1cmF0cyBhIGxlcyBlc3RhY2lvbnMgZGUgbGEgY2l1dGF0IGRlIEJhcmNlbG9uYS4KTCdhY3R1YWxpdHphY2nDsyBlcyByZWFsaXR6YSBlbiBpbnRlcnZhbHMgZCd1bmEgaG9yYSBpbmRpY2FudCBzaSBlbCB2YWxvciBlc3TDoCBvIG5vIHZhbGlkYXQgaSB0YW1iw6kgZXMgbW9zdHJlbiBsZXMgZGFkZXMgZGVscyB0cmVzIGRpZXMgYW50ZXJpb3JzIGEgbCdhY3R1YWwuIFRhbm1hdGVpeCBlcyBwdWJsaXF1ZW4gaGlzdMOycmljcyBhbWIgcGVyaW9kaWNpdGF0IG1lbnN1YWwuCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKSAKbGlicmFyeShkcGx5cikKbGlicmFyeShsdWJyaWRhdGUpCmBgYAoKYGBge3J9CmdlbmVyIDwtIHRibF9kZihmcmVhZCgiZGF0YS8yMDE5XzAxX0dlbmVyX3F1YWxpdGF0X2FpcmVfQkNOLmNzdiIsCiAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKSkKZ2VuZXIgJT4lIHNlbGVjdChub21fY2FiaW5hLCBsb25naXR1ZCwgbGF0aXR1ZCkgJT4lIGRpc3RpbmN0KCkKYGBgCgpgYGB7cn0KZ2VuZXIyIDwtIGdlbmVyICU+JQogIG11dGF0ZShzZWN0b3IgPSBhcy5mYWN0b3Ioc3RyX2V4dHJhY3Qobm9tX2NhYmluYSwgIig/PD1bLV1cXEQpLioiKSksCiAgICAgICAgIHF1YWxpdGF0X2FpcmUgPSBhcy5mYWN0b3IocXVhbGl0YXRfYWlyZSksCiAgICAgICAgIHF1YWxpdGF0X28zID0gYXMuZmFjdG9yKHF1YWxpdGF0X28zKSwKICAgICAgICAgdmFsb3JfbzMgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KHZhbG9yX28zLCAiXltbOmRpZ2l0Ol1dIikpLAogICAgICAgICBxdWFsaXRhdF9ubzIgPSBhcy5mYWN0b3IocXVhbGl0YXRfbm8yKSwKICAgICAgICAgdmFsb3Jfbm8yID0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdCh2YWxvcl9ubzIsICJeW1s6ZGlnaXQ6XV0iKSksCiAgICAgICAgIHF1YWxpdGF0X3BtMTAgPSBhcy5mYWN0b3IocXVhbGl0YXRfcG0xMCksCiAgICAgICAgIHZhbG9yX3BtMTAgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KHZhbG9yX3BtMTAsICJeW1s6ZGlnaXQ6XV0iKSksCiAgICAgICAgIGdlbmVyYXQgPSBkbXlfaG0oZ2VuZXJhdCkKICAgICAgICAgKSAlPiUKICBzZWxlY3Qoc2VjdG9yLCBxdWFsaXRhdF9haXJlLCBxdWFsaXRhdF9vMywgdmFsb3JfbzMsIHF1YWxpdGF0X25vMiwgdmFsb3Jfbm8yLCBxdWFsaXRhdF9wbTEwLAogICAgICAgICB2YWxvcl9wbTEwLCBnZW5lcmF0KQpzdW1tYXJ5KGdlbmVyMikKYGBgCgpgYGB7cn0KZ2VuZXIyICU+JSAKICBmaWx0ZXIoc2VjdG9yID09ICJQYWxhdSBSZWlhbCIpICU+JSAKICBzZWxlY3QodmFsb3Jfbm8yLCBnZW5lcmF0KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBnZW5lcmF0LCB5ID0gdmFsb3Jfbm8yKSkgKwogIGdlb21fbGluZSgpCgpgYGAKCmBgYHtyfQpnZW5lcjIgJT4lIAogIGZpbHRlcihzZWN0b3IgPT0gIlBhbGF1IFJlaWFsIiwgZ2VuZXJhdCA+PSBhcy5EYXRlKCIyMDE5LTAxLTE1IiksIGdlbmVyYXQgPD0gYXMuRGF0ZSgiMjAxOS0wMS0xNiIpKSAlPiUgCiAgc2VsZWN0KHZhbG9yX25vMiwgZ2VuZXJhdCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZ2VuZXJhdCwgeSA9IHZhbG9yX25vMikpICsKICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKQogIAoKYGBgCgoKYGBge3J9CmdlbmVyMyA8LSBnZW5lciAlPiUgCiAgbXV0YXRlKHNlY3RvciA9IGFzLmZhY3RvcihzdHJfZXh0cmFjdChub21fY2FiaW5hLCAiKD88PVstXVxcRCkuKiIpKSwKICAgICAgICAgcXVhbGl0YXRfYWlyZSA9IGFzLmZhY3RvcihxdWFsaXRhdF9haXJlKSwKICAgICAgICAgcXVhbGl0YXRfbzMgPSBhcy5mYWN0b3IocXVhbGl0YXRfbzMpLAogICAgICAgICB2YWxvcl9vMyA9IGFzLm51bWVyaWMoc3RyX2V4dHJhY3QodmFsb3JfbzMsICJeW1s6ZGlnaXQ6XV0iKSksCiAgICAgICAgIHF1YWxpdGF0X25vMiA9IGFzLmZhY3RvcihxdWFsaXRhdF9ubzIpLAogICAgICAgICB2YWxvcl9ubzIgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KHZhbG9yX25vMiwgIl5bWzpkaWdpdDpdXSIpKSwKICAgICAgICAgcXVhbGl0YXRfcG0xMCA9IGFzLmZhY3RvcihxdWFsaXRhdF9wbTEwKSwKICAgICAgICAgdmFsb3JfcG0xMCA9IGFzLm51bWVyaWMoc3RyX2V4dHJhY3QodmFsb3JfcG0xMCwgIl5bWzpkaWdpdDpdXSIpKSwKICAgICAgICAgZGF0ZSA9IHN0cl9leHRyYWN0KGdlbmVyYXQsICIuKltbOnNwYWNlOl1dIiksCiAgICAgICAgIGhvdXIgPSBzdHJfZXh0cmFjdChnZW5lcmF0LCAiKD88PVtbOnNwYWNlOl1dKVswLTkuXSsiKSkgJT4lCiAgc2VwYXJhdGUoY29sID0gZGF0ZSwgaW50byA9IGMoImRheSIsICJtb250aCIsICJ5ZWFyIiksIHNlcCA9ICIvIikgJT4lCiAgbXV0YXRlKGRheSA9IGFzLmludGVnZXIoZGF5KSwKICAgICAgICAgbW9udGggPSBhcy5pbnRlZ2VyKG1vbnRoKSwKICAgICAgICAgeWVhciA9IGFzLmludGVnZXIoeWVhciksCiAgICAgICAgIGhvdXIgPSBhcy5pbnRlZ2VyKGhvdXIpKSAlPiUKICBzZWxlY3Qoc2VjdG9yLCBxdWFsaXRhdF9haXJlLCBxdWFsaXRhdF9vMywgdmFsb3JfbzMsIHF1YWxpdGF0X25vMiwgdmFsb3Jfbm8yLCBxdWFsaXRhdF9wbTEwLAogICAgICAgICB2YWxvcl9wbTEwLCBkYXksIG1vbnRoLCB5ZWFyLCBob3VyKQpzdW1tYXJ5KGdlbmVyMykKYGBgCgpCVjogwrVnL23CsyBtZWRpbyBkZSBjb250YW1pbmFkb3JlcyBwb3IgaG9yYXMgZW4gZW5lcm8gZW4gOCBiYXJyaW9zIGRlIEJhcmNlbG9uYS4KYGBge3J9CmdlbmVyMyAlPiUgCiAgZ2F0aGVyKG1lYXN1cmUsIG1lYXN1cmVfdmFsdWUsIHZhbG9yX28zLCB2YWxvcl9ubzIsIHZhbG9yX3BtMTApICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTksIG1vbnRoID09IDEpICU+JQogIHNlbGVjdChkYXksIGhvdXIsIG1lYXN1cmUsIG1lYXN1cmVfdmFsdWUsIHNlY3RvcikgJT4lCiAgZ3JvdXBfYnkoaG91ciwgbWVhc3VyZSwgc2VjdG9yKSAlPiUKICBzdW1tYXJpc2UobWVhbl92YWxfaG91ciA9IG1lYW4obWVhc3VyZV92YWx1ZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyhob3VyLCBtZWFuX3ZhbF9ob3VyLCBjb2xvciA9IG1lYXN1cmUpKSArCiAgbGFicyh0aXRsZSA9ICLCtWcvbcKzIG1lZGlvIGRlIGNvbnRhbWluYWRvcmVzIiwKICAgICAgIHggPSAiSG9yYSIsIAogICAgICAgeSA9ICLCtWcvbcKzIG1lZGlvIiwKICAgICAgIGNvbG9yID0gIkNvbnRhbWluYWRvciIsCiAgICAgICBjYXB0aW9uID0gIkRhdG9zIGRlIG9wZW5kYXRhLWFqdW50YW1lbnQuYmFyY2Vsb25hLmNhdCIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOTzIiLCAiTzMiLCAiUE0xMCIpKSArCiAgZ2VvbV9saW5lKCkgKwogICNnZW9tX3BvaW50KCkgKyAKICBmYWNldF93cmFwKH4gc2VjdG9yLCBucm93ID0gMikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKClRoZSBzdHVkeSBzdWdnZXN0ZWQgdGhhdCBmb3IgMjAxNSwgdGhlIHRvdGFsIGV4aXN0aW5nIFVLIHZlZ2V0YXRpb24gcmVkdWNlcyB0aGUgYXZlcmFnZSBhbm51YWwgc3VyZmFjZSBjb25jZW50cmF0aW9uIGJ5IGFib3V0IDEwJSBmb3IgUE0yLjUsIDYlIGZvciBQTTEwLCAxMyUgZm9yIE8zLCAyNCUgZm9yIE5IMyBhbmQgMzAlIGZvciBTTzIsIGJ1dCBkaWQgbm90IG1hcmtlZGx5IGNoYW5nZSBOTzIgY29uY2VudHJhdGlvbnMuCmh0dHBzOi8vYWlycXVhbGl0eW5ld3MuY29tLzIwMTgvMDcvMzAvcGxhbnRzLWFuZC10cmVlcy1ub3QtdGhlLXNvbHV0aW9uLXRvLWFpci1wb2xsdXRpb24taW4tY2l0aWVzLwoKQ2xlYW5pbmcgZGF0YXNldCBmdW5jdGlvbjoKYGBge3J9CmNsZWFuX2Jjbl9kYXRhIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBkYXRhIDwtIGRhdGEgJT4lIAogIG11dGF0ZShzZWN0b3IgPSBhcy5mYWN0b3Ioc3RyX2V4dHJhY3Qobm9tX2NhYmluYSwgIig/PD1bLV1cXEQpLioiKSksCiAgICAgICAgIHF1YWxpdGF0X2FpcmUgPSBhcy5mYWN0b3IocXVhbGl0YXRfYWlyZSksCiAgICAgICAgIHF1YWxpdGF0X28zID0gYXMuZmFjdG9yKHF1YWxpdGF0X28zKSwKICAgICAgICAgdmFsb3JfbzMgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KHZhbG9yX28zLCAiXltbOmRpZ2l0Ol1dIikpLAogICAgICAgICBxdWFsaXRhdF9ubzIgPSBhcy5mYWN0b3IocXVhbGl0YXRfbm8yKSwKICAgICAgICAgdmFsb3Jfbm8yID0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdCh2YWxvcl9ubzIsICJeW1s6ZGlnaXQ6XV0iKSksCiAgICAgICAgIHF1YWxpdGF0X3BtMTAgPSBhcy5mYWN0b3IocXVhbGl0YXRfcG0xMCksCiAgICAgICAgIHZhbG9yX3BtMTAgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KHZhbG9yX3BtMTAsICJeW1s6ZGlnaXQ6XV0iKSksCiAgICAgICAgIGRhdGUgPSBzdHJfZXh0cmFjdChnZW5lcmF0LCAiLipbWzpzcGFjZTpdXSIpLAogICAgICAgICBob3VyID0gc3RyX2V4dHJhY3QoZ2VuZXJhdCwgIig/PD1bWzpzcGFjZTpdXSlbMC05Ll0rIikpICU+JQogIHNlcGFyYXRlKGNvbCA9IGRhdGUsIGludG8gPSBjKCJkYXkiLCAibW9udGgiLCAieWVhciIpLCBzZXAgPSAiLyIpICU+JQogIG11dGF0ZShkYXkgPSBhcy5pbnRlZ2VyKGRheSksCiAgICAgICAgIG1vbnRoID0gYXMuaW50ZWdlcihtb250aCksCiAgICAgICAgIHllYXIgPSBhcy5pbnRlZ2VyKHllYXIpLAogICAgICAgICBob3VyID0gYXMuaW50ZWdlcihob3VyKSwKICAgICAgICAgbW9udGggPSBjYXNlX3doZW4obW9udGggPT0gMSB+IGFzLmludGVnZXIoMTMpLCBUUlVFIH4gYXMuaW50ZWdlcihtb250aCkpKSAlPiUKICBzZWxlY3Qoc2VjdG9yLCBxdWFsaXRhdF9haXJlLCBxdWFsaXRhdF9vMywgdmFsb3JfbzMsIHF1YWxpdGF0X25vMiwgdmFsb3Jfbm8yLCBxdWFsaXRhdF9wbTEwLAogICAgICAgICB2YWxvcl9wbTEwLCBkYXksIG1vbnRoLCB5ZWFyLCBob3VyKQogIGRhdGEKfQpgYGAKCkFnZ3JlZ2F0ZSBkYXRhOgpgYGB7cn0KZGF0YV8wNl8yMDE4IDwtIHRibF9kZihmcmVhZCgiZGF0YS8yMDE4XzA2X0p1bnlfcXVhbGl0YXRfYWlyZV9CQ04uY3N2IiwgaGVhZGVyPVRSVUUpKQpkYXRhXzA3XzIwMTggPC0gdGJsX2RmKGZyZWFkKCJkYXRhLzIwMThfMDdfSnVsaW9sX3F1YWxpdGF0X2FpcmVfQkNOLmNzdiIsIGhlYWRlcj1UUlVFKSkKZGF0YV8wOF8yMDE4IDwtIHRibF9kZihmcmVhZCgiZGF0YS8yMDE4XzA4X0Fnb3N0X3F1YWxpdGF0X2FpcmVfQkNOLmNzdiIsIGhlYWRlcj1UUlVFKSkKZGF0YV8wOV8yMDE4IDwtIHRibF9kZihmcmVhZCgiZGF0YS8yMDE4XzA5X1NldGVtYnJlX3F1YWxpdGF0X2FpcmVfQkNOLmNzdiIsIGhlYWRlcj1UUlVFKSkKZGF0YV8xMF8yMDE4IDwtIHRibF9kZihmcmVhZCgiZGF0YS8yMDE4XzEwX09jdHVicmVfcXVhbGl0YXRfYWlyZV9CQ04uY3N2IiwgaGVhZGVyPVRSVUUpKQpkYXRhXzEyXzIwMTggPC0gdGJsX2RmKGZyZWFkKCJkYXRhLzIwMThfMTJfRGVzZW1icmVfcXVhbGl0YXRfYWlyZV9CQ04uY3N2IiwgaGVhZGVyPVRSVUUpKQpkYXRhXzExXzIwMTggPC0gdGJsX2RmKGZyZWFkKCJkYXRhLzIwMThfMTFfbm92ZW1icmVfcXVhbGl0YXRfYWlyZV9CQ04uY3N2IiwgaGVhZGVyPVRSVUUpKQpkYXRhXzAxXzIwMTkgPC0gdGJsX2RmKGZyZWFkKCJkYXRhLzIwMTlfMDFfR2VuZXJfcXVhbGl0YXRfYWlyZV9CQ04uY3N2IiwgaGVhZGVyPVRSVUUpKQpkYXRhIDwtIHJiaW5kKGRhdGFfMDZfMjAxOCwKICAgICAgICAgICAgICBkYXRhXzA3XzIwMTgsCiAgICAgICAgICAgICAgZGF0YV8wOF8yMDE4LAogICAgICAgICAgICAgIGRhdGFfMDlfMjAxOCwKICAgICAgICAgICAgICBkYXRhXzEwXzIwMTgsCiAgICAgICAgICAgICAgZGF0YV8xMV8yMDE4LAogICAgICAgICAgICAgIGRhdGFfMTJfMjAxOCwKICAgICAgICAgICAgICBkYXRhXzAxXzIwMTkpICU+JSBjbGVhbl9iY25fZGF0YSgpIApzdW1tYXJ5KGRhdGEpCmBgYAoKYGBge3J9CnBsb3RpdCA8LSBkYXRhICU+JSAKICBnYXRoZXIobWVhc3VyZSwgbWVhc3VyZV92YWx1ZSwgdmFsb3JfbzMsIHZhbG9yX25vMiwgdmFsb3JfcG0xMCkgJT4lCiAgZmlsdGVyKHllYXIgPj0gMjAxOCwgbW9udGggPj0gNiwgc2VjdG9yICVpbiUgYygiRWl4YW1wbGUiLCAiUGFsYXUgUmVpYWwiLCAiVmFsbCBIZWJyb24iKSkgJT4lCiAgc2VsZWN0KG1vbnRoLCBkYXksIGhvdXIsIG1lYXN1cmUsIG1lYXN1cmVfdmFsdWUsIHNlY3RvcikgJT4lCiAgZ3JvdXBfYnkobW9udGgsIGhvdXIsIG1lYXN1cmUsIHNlY3RvcikgJT4lCiAgc3VtbWFyaXNlKG1lYW5fdmFsX2hvdXIgPSBtZWFuKG1lYXN1cmVfdmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMoaG91ciwgbWVhbl92YWxfaG91ciwgY29sb3IgPSBtZWFzdXJlKSkgKwogIGxhYnModGl0bGUgPSAiwrVnL23CsyBtZWRpbyBkZSBjb250YW1pbmFkb3JlcyIsCiAgICAgICB4ID0gIkhvcmEiLCAKICAgICAgIHkgPSAiwrVnL23CsyBtZWRpbyIsCiAgICAgICBjb2xvciA9ICJDb250YW1pbmFkb3IiLAogICAgICAgY2FwdGlvbiA9ICJEYXRvcyBkZSBvcGVuZGF0YS1hanVudGFtZW50LmJhcmNlbG9uYS5jYXQiKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiTk8yIiwgIk8zIiwgIlBNMTAiKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKyAKICBmYWNldF9ncmlkKHNlY3RvciB+IG1vbnRoKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9CmRhdGEgJT4lIAogIGdhdGhlcihtZWFzdXJlLCBtZWFzdXJlX3ZhbHVlLCB2YWxvcl9vMywgdmFsb3Jfbm8yLCB2YWxvcl9wbTEwKSAlPiUKICBmaWx0ZXIoeWVhciA+PSAyMDE4LCBtb250aCA+PSA2LCBzZWN0b3IgJWluJSBjKCJFaXhhbXBsZSIsICJQYWxhdSBSZWlhbCIsICJWYWxsIEhlYnJvbiIpKSAlPiUKICBzZWxlY3QobW9udGgsIGRheSwgaG91ciwgbWVhc3VyZSwgbWVhc3VyZV92YWx1ZSwgc2VjdG9yKSAlPiUKICBncm91cF9ieShtb250aCwgbWVhc3VyZSwgc2VjdG9yKSAlPiUKICBzdW1tYXJpc2UobWVhbl92YWxfbW9udGggPSBtZWFuKG1lYXN1cmVfdmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMobW9udGgsIG1lYW5fdmFsX21vbnRoLCBjb2xvciA9IG1lYXN1cmUpKSArCiAgbGFicyh0aXRsZSA9ICLCtWcvbcKzIG1lZGlvIGRlIGNvbnRhbWluYWRvcmVzIiwKICAgICAgIHggPSAiTWVzIiwgCiAgICAgICB5ID0gIsK1Zy9twrMgbWVkaW8iLAogICAgICAgY29sb3IgPSAiQ29udGFtaW5hZG9yIiwKICAgICAgIGNhcHRpb24gPSAiRGF0b3MgZGUgb3BlbmRhdGEtYWp1bnRhbWVudC5iYXJjZWxvbmEuY2F0IikgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk5PMiIsICJPMyIsICJQTTEwIikpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZmFjZXRfd3JhcCh+IHNlY3RvciwgbnJvdyA9IDQpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0KcGxvdGl0IDwtIGRhdGEgJT4lIAogIGdhdGhlcihtZWFzdXJlLCBtZWFzdXJlX3ZhbHVlLCB2YWxvcl9vMywgdmFsb3Jfbm8yLCB2YWxvcl9wbTEwKSAlPiUKICBmaWx0ZXIoeWVhciA+PSAyMDE4LCBtb250aCA+PSA2LCBzZWN0b3IgJWluJSBjKCJFaXhhbXBsZSIsICJQYWxhdSBSZWlhbCIsICJWYWxsIEhlYnJvbiIpKSAlPiUKICBzZWxlY3QobW9udGgsIGRheSwgaG91ciwgbWVhc3VyZSwgbWVhc3VyZV92YWx1ZSwgc2VjdG9yKSAlPiUKICBncm91cF9ieShtb250aCwgc2VjdG9yKSAlPiUKICBzdW1tYXJpc2UobWVhbl92YWxfbW9udGggPSBtZWFuKG1lYXN1cmVfdmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMobW9udGgsIG1lYW5fdmFsX21vbnRoKSkgKwogIGxhYnModGl0bGUgPSAiwrVnL23CsyBtZWRpbyBkZSBjb250YW1pbmFkb3JlcyIsCiAgICAgICB4ID0gIk1lcyIsIAogICAgICAgeSA9ICLCtWcvbcKzIG1lZGlvIiwKICAgICAgIGNhcHRpb24gPSAiRGF0b3MgZGUgb3BlbmRhdGEtYWp1bnRhbWVudC5iYXJjZWxvbmEuY2F0IikgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKyAKICBmYWNldF93cmFwKH4gc2VjdG9yLCBucm93ID0gNCkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShodG1sd2lkZ2V0cykKc2F2ZVdpZGdldChnZ3Bsb3RseShwbG90aXQsIGR5bmFtaWNUaWNrcyA9IEZBTFNFKSwgZmlsZSA9ICJtZWFuY29udC5odG1sIik7CmBgYAoKIyMjIEp1c3QgY2xlYW4KYGBge3J9CmNsZWFuX2RhdGEgPC0gZnVuY3Rpb24oZGF0YSkgewogIGRhdGEgPC0gZGF0YSAlPiUgCiAgbXV0YXRlKHNlY3RvciA9IGFzLmZhY3RvcihzdHJfZXh0cmFjdChub21fY2FiaW5hLCAiKD88PVstXVxcRCkuKiIpKSwKICAgICAgICAgcXVhbGl0YXRfYWlyZSA9IGFzLmZhY3RvcihxdWFsaXRhdF9haXJlKSwKICAgICAgICAgcXVhbGl0YXRfbzMgPSBhcy5mYWN0b3IocXVhbGl0YXRfbzMpLAogICAgICAgICB2YWxvcl9vMyA9IGFzLm51bWVyaWMoc3RyX2V4dHJhY3QodmFsb3JfbzMsICJeW1s6ZGlnaXQ6XV0iKSksCiAgICAgICAgIHF1YWxpdGF0X25vMiA9IGFzLmZhY3RvcihxdWFsaXRhdF9ubzIpLAogICAgICAgICB2YWxvcl9ubzIgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KHZhbG9yX25vMiwgIl5bWzpkaWdpdDpdXSIpKSwKICAgICAgICAgcXVhbGl0YXRfcG0xMCA9IGFzLmZhY3RvcihxdWFsaXRhdF9wbTEwKSwKICAgICAgICAgdmFsb3JfcG0xMCA9IGFzLm51bWVyaWMoc3RyX2V4dHJhY3QodmFsb3JfcG0xMCwgIl5bWzpkaWdpdDpdXSIpKSwKICAgICAgICAgZGF0ZSA9IHN0cl9leHRyYWN0KGdlbmVyYXQsICIuKltbOnNwYWNlOl1dIiksCiAgICAgICAgIGhvdXIgPSBzdHJfZXh0cmFjdChnZW5lcmF0LCAiKD88PVtbOnNwYWNlOl1dKVswLTkuXSsiKSkgJT4lCiAgc2VwYXJhdGUoY29sID0gZGF0ZSwgaW50byA9IGMoImRheSIsICJtb250aCIsICJ5ZWFyIiksIHNlcCA9ICIvIikgJT4lCiAgbXV0YXRlKGRheSA9IGFzLmludGVnZXIoZGF5KSwKICAgICAgICAgbW9udGggPSBhcy5pbnRlZ2VyKG1vbnRoKSwKICAgICAgICAgeWVhciA9IGFzLmludGVnZXIoeWVhciksCiAgICAgICAgIGhvdXIgPSBhcy5pbnRlZ2VyKGhvdXIpLAogICAgICAgICBtb250aCA9IGFzLmludGVnZXIobW9udGgpKSAlPiUKICBzZWxlY3Qoc2VjdG9yLCBxdWFsaXRhdF9haXJlLCBxdWFsaXRhdF9vMywgdmFsb3JfbzMsIHF1YWxpdGF0X25vMiwgdmFsb3Jfbm8yLCBxdWFsaXRhdF9wbTEwLAogICAgICAgICB2YWxvcl9wbTEwLCBkYXksIG1vbnRoLCB5ZWFyLCBob3VyKQogIGRhdGEKfQpgYGAKCmBgYHtyfQoocCA8LSBkYXRhXzA2XzIwMTggJT4lIGNsZWFuX2RhdGEoKSAlPiUKICBnYXRoZXIobWVhc3VyZSwgbWVhc3VyZV92YWx1ZSwgdmFsb3JfbzMsIHZhbG9yX25vMiwgdmFsb3JfcG0xMCkgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCwgbW9udGggPT0gNikgJT4lCiAgc2VsZWN0KGRheSwgaG91ciwgbWVhc3VyZSwgbWVhc3VyZV92YWx1ZSwgc2VjdG9yKSAlPiUKICAgbXV0YXRlKG1lYXN1cmUgPSBjYXNlX3doZW4obWVhc3VyZSA9PSAidmFsb3Jfbm8yIiB+ICJOTzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlID09ICJ2YWxvcl9vMyIgfiAiTzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlID09ICJ2YWxvcl9wbTEwIiB+ICJQTTEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IG1lYXN1cmUpKSAlPiUKICBncm91cF9ieShob3VyLCBtZWFzdXJlLCBzZWN0b3IpICU+JQogIHN1bW1hcmlzZShtZWFuX3ZhbF9ob3VyID0gbWVhbihtZWFzdXJlX3ZhbHVlLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgCiAgIAogICAKICBnZ3Bsb3QoYWVzKGhvdXIsIG1lYW5fdmFsX2hvdXIsIGNvbG9yID0gbWVhc3VyZSkpICsKICBsYWJzKHRpdGxlID0gIk1lYW4gdmFsdWUgb2YgcG9sbHV0YW50cyBieSBob3VyIGluIEp1bmUgMjAxOCIsCiAgICAgICB4ID0gIkhvdXIiLCAKICAgICAgIHkgPSAiwrVnL23CsyIsCiAgICAgICBjb2xvciA9ICJQb2xsdXRhbnQiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIGZyb20gb3BlbmRhdGEtYWp1bnRhbWVudC5iYXJjZWxvbmEuY2F0IikgKwogICNzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOTzIiLCAiTzMiLCAiUE0xMCIpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArIAogIGZhY2V0X3dyYXAofiBzZWN0b3IsIG5yb3cgPSAyKSArCiAgdGhlbWVfbWluZSgpCiAgKQpgYGAKCmBgYHtyfQpzYXZlV2lkZ2V0KGdncGxvdGx5KHAsIGR5bmFtaWNUaWNrcyA9IFRSVUUpLCBmaWxlID0gIm1lYW5qdW4uaHRtbCIpCmBgYAoKYGBge3J9CmdncGxvdGx5KHApIAoKYGBgCgoKCgoKCgoKCgoKCgoKCgojIyMgTW9ydGFsaXRhdApgYGB7cn0KbW9ydGFsaXRhdCA8LSB0YmxfZGYoZnJlYWQoIjIwMThfdGF4YV9tb3J0YWxpdGF0LmNzdiIsIGhlYWRlcj1UUlVFKSkKbW9ydGFsaXRhdCAlPiUKICBzZWxlY3QoTm9tX2Rpc3RyaWN0ZSwgTm9tX2JhcnJpLCBOb21icmUpICU+JQogIGdyb3VwX2J5KE5vbV9kaXN0cmljdGUpICU+JQogIHN1bW1hcmlzZShtZWFuX24gPSBtZWFuKE5vbWJyZSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2JhcihhZXMoeCA9IE5vbV9kaXN0cmljdGUsIHkgPSBtZWFuX24pLHN0YXQgPSAiaWRlbnRpdHkiKQpgYGAKCgpgYGB7cn0KdGhlbWVfbWluZSA8LSBmdW5jdGlvbiAoKSB7IAogICAgdGhlbWVfYncoYmFzZV9zaXplPTEyLCBiYXNlX2ZhbWlseT0iTW9udHNlcnJhdCIpICUrcmVwbGFjZSUgCiAgICAgICAgdGhlbWUoCiAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2ViZmZmNSIsIGNvbG91cj1OQSksIAogICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpCiAgICAgICAgKQp9CmBgYAoKCmBgYHtyfQpkYXRhXzA2XzIwMTkgPC0gdGJsX2RmKGZyZWFkKCJkYXRhLzIwMTlfMDZfanVueV9xdWFsaXRhdF9haXJlX0JDTi5jc3YiLCBoZWFkZXI9VFJVRSkpCnN1bW1hcnkoZGF0YV8wNl8yMDE5KQpgYGAKCgpgYGB7cn0KbGVuZ3RoKG5hbWVzKGRhdGFfMDZfMjAxOSkpCihpIDwtIGRhdGFfMDZfMjAxOSAlPiUKICBzZWxlY3QoNTo1NykgJT4lCiAgbXV0YXRlKG1lYXN1cmUgPSBhcy5mYWN0b3IoY2FzZV93aGVuKENPRElfQ09OVEFNSU5BTlQgPT0gMSB+ICJTTzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RJX0NPTlRBTUlOQU5UID09IDcgfiAiTk8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RJX0NPTlRBTUlOQU5UID09IDggfiAiTk8yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESV9DT05UQU1JTkFOVCA9PSAxMiB+ICJOT3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RJX0NPTlRBTUlOQU5UID09IDE0IH4gIk8zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESV9DT05UQU1JTkFOVCA9PSA2IH4gIkNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESV9DT05UQU1JTkFOVCA9PSAxMCB+ICJQTTEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICIiKSkpICU+JQogIG11dGF0ZShzZWN0b3IgPSBhcy5mYWN0b3IoY2FzZV93aGVuKEVTVEFDSU8gPT0gNCB+ICJQb2JsZW5vdSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEFDSU8gPT0gNDIgfiAiU2FudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RBQ0lPID09IDQzIH4gIkVpeGFtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUQUNJTyA9PSA0NCB+ICJHcsOgY2lhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUQUNJTyA9PSA1MCB+ICJDaXV0YWRlbGxhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUQUNJTyA9PSA1NCB+ICJWYWxsIEhlYnJvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEFDSU8gPT0gNTcgfiAiUGFsYXUgUmVpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIiIpKSkgJT4lCiAgZ2F0aGVyKGhvdXIsIG1lYXN1cmVfdmFsdWUsIHN0YXJ0c193aXRoKCJIIikpICU+JQogIGdhdGhlcih2YWxpZGF0aW9uLCB2YWwsIHN0YXJ0c193aXRoKCJWIikpICU+JSBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShkYXkgPSBhcy5pbnRlZ2VyKERJQSksCiAgICAgICAgIG1vbnRoID0gYXMuaW50ZWdlcihNRVMpLAogICAgICAgICB5ZWFyID0gYXMuaW50ZWdlcihBTlkpLAogICAgICAgICBob3VyID0gYXMuaW50ZWdlcihzdHJfZXh0cmFjdChob3VyLCIuLiQiKSkpICU+JQogIHNlbGVjdChzZWN0b3IsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1lYXN1cmUsIG1lYXN1cmVfdmFsdWUpICU+JQogICNmaWx0ZXIoc2VjdG9yID09ICJDaXV0YWRlbGxhIikgJT4lCiAgZ3JvdXBfYnkoaG91ciwgbWVhc3VyZSwgc2VjdG9yKSAlPiUKICBzdW1tYXJpc2UobWVhbl92YWxfaG91ciA9IG1lYW4obWVhc3VyZV92YWx1ZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgICAKICBnZ3Bsb3QoYWVzKGhvdXIsIG1lYW5fdmFsX2hvdXIsIGNvbG9yID0gbWVhc3VyZSkpICsKICBsYWJzKHRpdGxlID0gIk1lYW4gdmFsdWUgb2YgcG9sbHV0YW50cyBieSBob3VyIGluIEp1bmUgMjAxOSIsCiAgICAgICB4ID0gIkhvdXIiLCAKICAgICAgIHkgPSAiwrVnL23CsyIsCiAgICAgICBjb2xvciA9ICJQb2xsdXRhbnQiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIGZyb20gb3BlbmRhdGEtYWp1bnRhbWVudC5iYXJjZWxvbmEuY2F0IikgKwogICNzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOTzIiLCAiTzMiLCAiUE0xMCIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInB1cnBsZSIsICJ5ZWxsb3ciLCAicmVkIiwgIm9yYW5nZSIsICJncmVlbiIsICJibHVlIiwgInBpbmsiKSkgKwogIGdlb21fbGluZShzaXplPTEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA5MCwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICJyZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMTEwLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gImdyZWVuIikgKwogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMDAsIGxpbmV0eXBlID0gMiwgY29sb3IgPSAicGluayIpICsKICAjZ2VvbV90ZXh0KGFlcygwLDkwLGxhYmVsID0gIkxpbWl0IE5PMiBieSBoIiwgdmp1c3QgPSAtMSksIGNvbG9yID0gImJsYWNrIikgKwogICNnZW9tX3BvaW50KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMikpICsgCiAgZmFjZXRfd3JhcCh+IHNlY3RvciwgbnJvdyA9IDEpICsKICB0aGVtZV9taW5lKCkpCgogIApgYGAKCmBgYHtyfQpnZ3Bsb3RseShpKSAKYGBgCgoKCgoKCgoKCgoKCgo=